本文章的內容僅限學術及研究用途,請勿進行任何違法行為,否則後果自負。
M1 卡在進行第一次認證之後到卡片回到待命狀態之前,與讀卡機的所有通訊資料全部都會被 keystream 加密。但因為 Crypto-1 本身設計上的缺陷,在某些情況下會洩漏 keystream 的部分資訊,讓我們有機會可以還原 keystream,進而推算出金鑰。
ISO 14443A 的規範中要求使用 parity bit 來驗證資料傳輸的正確性,但 M1 卡在加密通訊資料後,會重複使用一小部分的 keystream 來加密 parity bit,導致 keystream 洩漏。Hardnested 攻擊就是利用這個資訊來推算部分 keystream 的資訊。
在 M1 卡進行第一次認證之後,如果想要更換認證的區段或金鑰時,會進行新的一輪三步驟認證。但與第一次不同的是,卡片挑戰 nt 並不會明碼傳送,而是會使用新的卡片金鑰來產生 keystream1 並與卡片挑戰 nt 進行 XOR 運算,然後再傳送給讀卡機。如果在 nt 已知的情況下,就能夠推算出 keystream0,進而逆推出卡片金鑰。
首先,均民先寫一段程式來模擬第二次認證,然後使用 Proxmark3 來攔截通訊的資料,攔截的資料如下:
第一段是喚醒卡片、防碰撞以及選擇卡片:
接下來是第一次認證:
第一次認證成功後,讀卡機傳送 60 07 CRC
給卡片,這段資料會用第一次認證的 keystream 進行加密,其中 0x60
代表對 Key A 進行認證,0x07
代表區塊 7:
接下來卡片會傳送卡片挑戰 nt 給讀卡機,這段資料會使用第二次認證的 keystream0 進行加密:
然後讀卡機會產生一個讀卡機挑戰 nr 並與第二次認證的 keystream1 進行 XOR 運算,並使用卡片挑戰 nt 產生 ar 與第二次認證的 keystream2 進行 XOR 運算之後一起傳送給卡片:
最後,卡片會驗證 ar 的正確性,如果正確就使用讀卡機挑戰 nr 產生 at 與第二次認證的 keystream3 進行 XOR 運算之後傳送給讀卡機: